/**
 * 服务器上的文件检测，文件的访问时间
 *
 * 遍历所有文件，最后一次访问时间-当前时间
 * 非热点文件压缩。
 *
 */
#ifndef __M_HOT_H__
#define __M_HOT_H__
#include <unistd.h>
#include "Data.hpp"

extern cloud::DataManager *_data;
namespace cloud
{
    class HotManage
    {
    private:
        std::string _back_dir;    // 文件目录
        std::string _pack_dir;    // 压缩包目录
        std::string _pack_suffix; // 压缩包后缀名
        int _hot_time;            // 设置热点时间
    private:
        // false:热点   true:非热点
        bool HotTimeJudge(const std::string &filename)
        {
            FileUtil fu(filename);
            time_t last_time = fu.LastATime();
            time_t cur_time = time(NULL);
            if (cur_time - last_time > _hot_time)
            {
                return true;
            }
            return false;
        }

    public:
        HotManage()
        {
            Config *config = Config::GetInstance();
            _back_dir = config->GetBackDir();
            _pack_dir = config->GetPackDir();
            _pack_suffix = config->GetPackFileSuffix();
            _hot_time = config->GetHotTime();

            FileUtil ftmp1(_back_dir);
            FileUtil ftmp2(_pack_dir);

            ftmp1.CreateDirectory();
            ftmp2.CreateDirectory();
        }

        bool RunMoudle()
        {
            while (1)
            {
                // 遍历备份目录，获取所有的文件名
                FileUtil fu(_back_dir);
                std::vector<std::string> arry;
                fu.ScanDirectory(&arry);
                // 遍历所有文件是否是热点文件
                for (auto &a : arry)
                {
                    if (HotTimeJudge(a) == false)
                    {
                        continue;
                    }
                    // 获取文件备份信息
                    BackupInfo info;
                    if (_data->GetOneByRealPath(a, &info) == false)
                    {
                        // 文件存在，但是不存在备份信息
                        info.NewBackupInfo(a);
                    }
                    // 非热点文件进行压缩
                    FileUtil tmp(a);
                    tmp.Compress(info.pack_path);
                    // 删除源文件，修改备份信息
                    tmp.Remove();
                    info.pack_flag = true;
                    _data->Update(info);
                }
                usleep(1000); // 避免空目录，消耗CPU资源过高
            }
            return true;
        }
    };
}

#endif //__M_HOT_H__